package br.com.petsis.funcionalidades.manterProntuario;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Cliente;
import br.com.petsis.entity.Empresa;
import br.com.petsis.entity.FormaPagamento;
import br.com.petsis.entity.Funcionario;
import br.com.petsis.entity.Pet;
import br.com.petsis.entity.Prontuario;

@Name("manterProntuarioController")
@Scope(ScopeType.CONVERSATION)
//@Restrict(value="#{identity.hasRole('Administrador')}")
public class ManterProntuarioController {
	
	private static final String QRY_PRONTUARIOS = "select p.id_prontuario,p.id_cliente,p.dta_atendimento,p.flg_pago,p.id_pet from prontuario p where p.id_empresa = :idEmpresa and p.flg_ativo = 'T' order by p.dta_atendimento DESC";
	private static final String QRY_CLIENTES = "select c.id_cliente,c.dsc_nome from cliente c where c.id_empresa = :idEmpresa and c.flg_ativo = 'T' order by c.dsc_nome";
	private static final String QRY_FUNCIONARIOS = "select f.id_funcionario,f.dsc_nome,f.dsc_cargo from funcionario f where f.id_empresa = :idEmpresa and f.flg_ativo = 'T' order by f.dsc_nome";
	private static final String QRY_FORMAS_PAGAMENTO = "select f.id_forma_pagamento,f.dsc_forma_pagamento from forma_pagamento f where f.flg_ativo = 'T' order by f.dsc_forma_pagamento";
	private static final String QRY_PETS_CLIENTE = "select p.id_pet,p.dsc_nome from pet p where p.id_cliente = :idCliente and p.flg_ativo = 'T'";
	
	private static final String PARAMETER_ID_EMPRESA = "idEmpresa";

	@In(create=true)
	private EntityManager entityManager;
	
	private List<Prontuario> listaProntuarios;
	
	private Prontuario prontuarioEdicao;
	
	private List<SelectItem> listaClientes;
	
	private List<SelectItem> listaFuncionarios;
	
	private List<SelectItem> listaFormasPagamento;
	
	private List<SelectItem> listaPets;

	private Integer idClienteSelecionado;
	
	private Integer idPetSelecionado;
	
	private Integer idFuncionarioSelecionado;
	
	private Integer idFormaPagamento;
	
	private boolean selecionadoTodos;
	
	private boolean exibePopupPagamento;
	
	@In(required=false)
	private Empresa empresaSessao;
	
	private String filtroNome;
	
	private String filtroData;
	
	private String filtroPago;
	
	private String filtroPet;
	
	public String getFiltroNome() {
		return filtroNome;
	}

	public void setFiltroNome(String filtroNome) {
		this.filtroNome = filtroNome;
	}

	public String getFiltroData() {
		return filtroData;
	}

	public void setFiltroData(String filtroData) {
		this.filtroData = filtroData;
	}

	public String getFiltroPago() {
		return filtroPago;
	}

	public void setFiltroPago(String filtroPago) {
		this.filtroPago = filtroPago;
	}
	
	public String getFiltroPet() {
		return filtroPet;
	}

	public void setFiltroPet(String filtroPet) {
		this.filtroPet = filtroPet;
	}

	public boolean filtrarProntuariosPorNome(Object current){
		Prontuario prontuario = (Prontuario)current;
		if(getFiltroNome() == null || getFiltroNome().isEmpty()){
			return true;
		}
		if(prontuario.getCliente().getDscNome().toLowerCase().contains(getFiltroNome().toLowerCase())){
			return true;
		}else{
			return false;
		}
	}
	
	public boolean filtrarProntuariosPorData(Object current){
		Prontuario prontuario = (Prontuario)current;
		if(getFiltroData() == null || getFiltroData().isEmpty()){
			return true;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		if(sdf.format(prontuario.getDtaAtendimento()).contains(getFiltroData())){
			return true;
		}else{
			return false;
		}
	}
	
	public boolean filtrarProntuariosPorPago(Object current){
		Prontuario prontuario = (Prontuario)current;
		if(getFiltroPago() == null || getFiltroPago().isEmpty()){
			return true;
		}
		if(prontuario.getFlgPagoExtenso().toLowerCase().contains(getFiltroPago().toLowerCase())){
			return true;
		}else{
			return false;
		}
	}
	
	public boolean filtrarProntuariosPorPet(Object current){
		Prontuario prontuario = (Prontuario)current;
		if(getFiltroPet() == null || getFiltroPet().isEmpty()){
			return true;
		}
		if(prontuario.getPet().getDscNome().toLowerCase().contains(getFiltroPet().toLowerCase())){
			return true;
		}else{
			return false;
		}
	}

	public void onLoad(){
		
	}
	
	public void onLoadList(){
		setProntuarioEdicao(null);
		getProntuarioEdicao();
		setIdClienteSelecionado(null);
		setIdFuncionarioSelecionado(null);
		setIdFormaPagamento(null);
	}
	
	public void excluir(){
		List<Prontuario> listaRemocao = new ArrayList<Prontuario>();
		for(Prontuario c : getListaProntuarios()){
			if(c.isSelecionado()){
				Prontuario p = entityManager.find(Prontuario.class, c.getIdProntuario());
				p.setFlgAtivo('F');
				entityManager.merge(p);
				listaRemocao.add(c);
			}
		}
		entityManager.flush();
		getListaProntuarios().removeAll(listaRemocao);
		setSelecionadoTodos(false);
	}
	
	public String salvar(){
		if(empresaSessao == null){
			FacesMessages.instance().add(Severity.ERROR,"Somente empresas podem cadastrar clientes");
			return null;
		}
		getProntuarioEdicao().setCliente(entityManager.find(Cliente.class, getIdClienteSelecionado()));
		getProntuarioEdicao().setFuncionario(getIdFuncionarioSelecionado() != null ?
				entityManager.find(Funcionario.class, getIdFuncionarioSelecionado()) : null);
		getProntuarioEdicao().setFormaPagamento(getIdFormaPagamento() != null ?
				entityManager.find(FormaPagamento.class, getIdFormaPagamento()) : null);
		getProntuarioEdicao().setPet(getIdPetSelecionado() != null ?
				entityManager.find(Pet.class, getIdPetSelecionado()) : null);
		getProntuarioEdicao().setFlgAtivo('T');
		getProntuarioEdicao().setEmpresa(empresaSessao);
		entityManager.merge(getProntuarioEdicao());
		entityManager.flush();
		setListaProntuarios(null);
		getListaProntuarios();
		fecharPopupPagamento();
		FacesMessages.instance().add(Severity.INFO,"Prontuário salvo com sucesso.");
		return "persisted";
	}
	
	public String editar(Prontuario prontuario){
		if(empresaSessao == null){
			return null;
		}
		prontuarioEdicao = entityManager.find(Prontuario.class, prontuario.getIdProntuario());
		idClienteSelecionado = prontuarioEdicao.getCliente().getIdCliente();
		idFuncionarioSelecionado = prontuarioEdicao.getFuncionario() != null ? prontuarioEdicao.getFuncionario().getIdFuncionario() : null;
		idFormaPagamento = prontuarioEdicao.getFormaPagamento() != null ? prontuarioEdicao.getFormaPagamento().getIdFormaPagamento() : null;
		return "editar";
	}

	public boolean isSelecionadoTodos() {
		return selecionadoTodos;
	}

	public void setSelecionadoTodos(boolean selecionadoTodos) {
		this.selecionadoTodos = selecionadoTodos;
	}
	
	public boolean isExibePopupPagamento() {
		return exibePopupPagamento;
	}

	public void setExibePopupPagamento(boolean exibePopupPagamento) {
		this.exibePopupPagamento = exibePopupPagamento;
	}
	
	public void inicializaPopupPagamento(){
		setExibePopupPagamento(true);
	}
	
	public void fecharPopupPagamento(){
		setExibePopupPagamento(false);
	}
	
	public void selecionaTodos(){
		for(Prontuario c : getListaProntuarios()){
			if(isSelecionadoTodos()){
				c.setSelecionado(true);
			}else{
				c.setSelecionado(false);
			}
		}
	}
	
	public String recuperaNomeCliente(Integer id){
		try{
			Object nome = entityManager.createNativeQuery("select c.dsc_nome from cliente c where c.id_cliente = :idCliente")
				.setParameter("idCliente", id)
				.getSingleResult();
			return nome != null ? nome.toString() : null;
		}catch (NoResultException e) {
			return null;
		}
	}
	
	public String recuperaNomePet(Integer id){
		try{
			Object nome = entityManager.createNativeQuery("select p.dsc_nome from pet p where p.id_pet = :idPet")
				.setParameter("idPet", id)
				.getSingleResult();
			return nome != null ? nome.toString() : null;
		}catch (NoResultException e) {
			return null;
		}
	}

	public List<Prontuario> getListaProntuarios() {
		
		/*p.id_prontuario,
		p.id_cliente,
		p.dta_atendimento,
		p.flg_pago,
		p.id_pet*/
		
		if (listaProntuarios == null) {
			listaProntuarios = new ArrayList<Prontuario>(); 
			if(empresaSessao != null){
				List<Object[]> lista = entityManager.createNativeQuery(QRY_PRONTUARIOS)
					.setParameter(PARAMETER_ID_EMPRESA, empresaSessao.getIdEmpresa())
					.getResultList();
				Prontuario p;
				for(Object[] o : lista){
					p = new Prontuario();
					p.setIdProntuario(Integer.parseInt(o[0].toString()));
					Cliente c = new Cliente();
					c.setIdCliente(Integer.parseInt(o[1].toString()));
					c.setDscNome(recuperaNomeCliente(c.getIdCliente()));
					p.setCliente(c);
					p.setDtaAtendimento(o[2] != null ? (Date)o[2] : null);
					p.setFlgPago(o[3] != null ? (Character)o[3] :  null);
					Pet pet = new Pet();
					pet.setIdPet(Integer.parseInt(o[4].toString()));
					pet.setDscNome(recuperaNomePet(pet.getIdPet()));
					p.setPet(pet);
					listaProntuarios.add(p);
				}
			}
		}
		return listaProntuarios;
	}

	public void setListaProntuarios(List<Prontuario> listaProntuarios) {
		this.listaProntuarios = listaProntuarios;
	}


	public Prontuario getProntuarioEdicao() {
		if (prontuarioEdicao == null) {
			prontuarioEdicao = new Prontuario();
			prontuarioEdicao.setFlgRetorno('F');
			prontuarioEdicao.setDtaAtendimento(new Date());
		}
		return prontuarioEdicao;
	}

	public void setProntuarioEdicao(Prontuario prontuarioEdicao) {
		this.prontuarioEdicao = prontuarioEdicao;
	}

	public String novoProntuario(){
		setIdClienteSelecionado(null);
		setIdFuncionarioSelecionado(null);
		setIdFormaPagamento(null);
		setProntuarioEdicao(new Prontuario());
		return "novo"; 
	}
	
	public String cancelar(){
		prontuarioEdicao = new Prontuario();
		return "voltar";  
	}

	public List<SelectItem> getListaClientes() {
		if (listaClientes == null) {
			listaClientes = new ArrayList<SelectItem>();
			listaClientes.add(new SelectItem(null,"Selecione"));
			List<Object[]> lista = entityManager.createNativeQuery(QRY_CLIENTES)
				.setParameter(PARAMETER_ID_EMPRESA, empresaSessao.getIdEmpresa())
				.getResultList();
			for(Object[] o : lista){
				listaClientes.add(new SelectItem(Integer.parseInt(o[0].toString()),
						o[1].toString()));
			}
		}

		return listaClientes;
	}

	public void setListaClientes(List<SelectItem> listaClientes) {
		this.listaClientes = listaClientes;
	}

	public List<SelectItem> getListaPets() {
		listaPets = new ArrayList<SelectItem>();
		listaPets.add(new SelectItem(null,"Selecione"));
		if(getIdClienteSelecionado() != null){
			List<Object[]> lista = entityManager.createNativeQuery(QRY_PETS_CLIENTE)
				.setParameter("idCliente", getIdClienteSelecionado())
				.getResultList();
			for(Object[] o : lista){
				listaPets.add(new SelectItem(Integer.parseInt(o[0].toString()),
						o[1].toString()));
			}
		}
		return listaPets;
	}

	public void setListaPets(List<SelectItem> listaPets) {
		this.listaPets = listaPets;
	}

	public List<SelectItem> getListaFuncionarios() {
		if (listaFuncionarios == null) {
			listaFuncionarios = new ArrayList<SelectItem>();
			listaFuncionarios.add(new SelectItem(null,"Selecione"));
			List<Object[]> lista = entityManager.createNativeQuery(QRY_FUNCIONARIOS)
				.setParameter(PARAMETER_ID_EMPRESA, empresaSessao.getIdEmpresa())
				.getResultList();
			for(Object[] o : lista){
				listaFuncionarios.add(new SelectItem(Integer.parseInt(o[0].toString()),
						o[1].toString()));
			}
		}
		return listaFuncionarios;
	}

	public void setListaFuncionarios(List<SelectItem> listaFuncionarios) {
		this.listaFuncionarios = listaFuncionarios;
	}

	public List<SelectItem> getListaFormasPagamento() {
		if (listaFormasPagamento == null) {
			listaFormasPagamento = new ArrayList<SelectItem>();
			listaFormasPagamento.add(new SelectItem(null,"Selecione"));
			List<Object[]> lista = entityManager.createNativeQuery(QRY_FORMAS_PAGAMENTO)
				.getResultList();
			for(Object[] o : lista){
				listaFormasPagamento.add(new SelectItem(Integer.parseInt(o[0].toString()),
						o[1].toString()));
			}
		}
		return listaFormasPagamento;
	}

	public void setListaFormasPagamento(List<SelectItem> listaFormasPagamento) {
		this.listaFormasPagamento = listaFormasPagamento;
	}

	public Integer getIdClienteSelecionado() {
		return idClienteSelecionado;
	}

	public void setIdClienteSelecionado(Integer idClienteSelecionado) {
		this.idClienteSelecionado = idClienteSelecionado;
	}

	public Integer getIdPetSelecionado() {
		return idPetSelecionado;
	}

	public void setIdPetSelecionado(Integer idPetSelecionado) {
		this.idPetSelecionado = idPetSelecionado;
	}

	public Integer getIdFuncionarioSelecionado() {
		return idFuncionarioSelecionado;
	}

	public void setIdFuncionarioSelecionado(Integer idFuncionarioSelecionado) {
		this.idFuncionarioSelecionado = idFuncionarioSelecionado;
	}

	public Integer getIdFormaPagamento() {
		return idFormaPagamento;
	}

	public void setIdFormaPagamento(Integer idFormaPagamento) {
		this.idFormaPagamento = idFormaPagamento;
	}
	
}
